home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-06-27 | 6.3 KB | 300 lines | [TEXT/CWIE] |
- /*------------------------------------------------------------------------------
- #
- # NewsTicker, my Hack for 1997
- #
- # SubWooferEndPoint.cp - Uses SubWoofer to read html pages in
- #
- ------------------------------------------------------------------------------*/
- #include <Errors.h>
- #include <string.h>
-
- #include "SubWooferEndPoint.h"
- #include "HTMLExtractor.h"
-
- static OSStatus MyNotifier(SubWooferEndPoint* me, URLReference urlRef, URLEvent event,
- const char* changed, UInt32 downloadSize)
- {
- me->HandleSubWoofer(event, changed);
- return noErr;
- }
- //
- // Our constructor
- //
- SubWooferEndPoint::SubWooferEndPoint( HTMLExtractor* theHandler )
- {
- mfDataWaiting = false;
- mfDoShutdown = false;
- mfBytesReceived = 0;
-
- mfMyHandler = theHandler;
- mfTheReference = nil;
- }
- //
- // Our destructor
- //
- SubWooferEndPoint::~SubWooferEndPoint( void )
- {
- HandleShutdown();
- if (mfTheReference)
- URLDisposeReference(mfTheReference);
- }
- //
- // Say we want to get the page
- //
- OSErr SubWooferEndPoint::StartGettingFile(char* address, short port, Idler* theIdler)
- {
- #ifdef USESUBWOOFER
- OSErr io;
- char newaddress[32] = "http://";
-
- strcat(newaddress, address);
-
- mfDataWaiting = false;
- mfDoShutdown = false;
- mfDoingHeader = false;
- mfBytesReceived = 0;
-
- //start getting the file
- if (mfTheReference)
- URLDisposeReference(mfTheReference);
- io = URLNewReference(newaddress, &mfTheReference);
-
- if (io==noErr)
- {
- //Start connecting to the URL
- io = URLOpen(mfTheReference,nil, 0, // openFlags,
- (URLNotifyProcPtr)MyNotifier, // notifyProc,
- kURLAllEventsFlag, //kURLDataAvailableEventFlag+kURLErrorOccurredEventFlag+kURLCompletedEventFlag, //event flags
- (unsigned long)this);
- }
-
- if (io!=noErr)
- {
- DebugStr("\pError opening");
- HandleShutdown();
- }
- return io;
- #else
- return -1;
- #endif
- }
-
- OSErr SubWooferEndPoint::StartGettingHeader(char* address, short port, Idler* theIdler)
- {
- #ifdef USESUBWOOFER
- OSErr io;
- char newaddress[32] = "http://";
-
- strcat(newaddress, address);
-
- mfDataWaiting = false;
- mfDoShutdown = false;
- mfDoingHeader = true;
- mfBytesReceived = 0;
-
- //start getting the file
- if (mfTheReference)
- URLDisposeReference(mfTheReference);
- io = URLNewReference(newaddress, &mfTheReference);
-
- if (io==noErr)
- {
- //Start connecting to the URL
- io = URLOpen(mfTheReference,nil, 0, // openFlags,
- nil, // notifyProc,
- kURLDataAvailableEventFlag+kURLErrorOccurredEventFlag+kURLCompletedEventFlag, //event flags
- (unsigned long)this);
- }
-
- if (io!=noErr)
- {
- HandleShutdown();
- }
- return io;
- #else
- return -1;
- #endif
- }
- //
- // Handle an event from SubWoofer
- //
- void SubWooferEndPoint::HandleSubWoofer(URLEvent event, const char* changed)
- {
- #ifdef USESUBWOOFER
- switch (event)
- {
- case kURLDataAvailableEvent:
- mfDataWaiting = true;
- if (mfDoingHeader)
- mfDoShutdown = true; //bail after we've got the header if that's all we want
- break;
- case kURLCompletedEvent:
- mfDoShutdown = true;
- break;
-
- }
- #endif
- }
- //
- // Handle the work of everything we have to do
- //
- void SubWooferEndPoint::DoIdle(void)
- {
- #ifdef USESUBWOOFER
- OSErr io;
- char* buffer;
- Size bufferSize;
- short index;
- Boolean GotOne;
- Size available;
-
- if (mfDoShutdown)
- {
- HandleShutdown();
- mfDoShutdown = false;
- }
- if (mfDataWaiting)
- {
- mfDataWaiting = false;
-
- io = URLGetDataAvailable(mfTheReference, &available);
- if (io!=noErr)
- return;
-
- //read some data in
-
- bufferSize = sizeof(mfInComingData) - mfBytesReceived;
- if (bufferSize<available)
- bufferSize = available;
- io = URLGetBuffer(mfTheReference, &buffer, &bufferSize);
- if (io!=noErr)
- {
- URLReleaseBuffer(mfTheReference, buffer);
- return;
- }
- BlockMove(buffer, &mfInComingData[mfBytesReceived], bufferSize);
- URLReleaseBuffer(mfTheReference, buffer);
-
- mfBytesReceived += bufferSize;
- available -= bufferSize;
-
- do //parse out all the lines of text
- {
- GotOne = false;
- for (index = 0; index < mfBytesReceived; index++)
- {
- if (mfInComingData[index]==0x0A) //found end of line, line feed of cr/lf
- {
- GotOne = true;
- index++; //convert the index into the size
- if (mfMyHandler) //have them handle it and clear it
- mfMyHandler->ReceiveString(mfInComingData, index);
- BlockMove(&mfInComingData[index], &mfInComingData[0], mfBytesReceived-index);
- mfBytesReceived-=index;
- index = 0;
- }
- }
- if (!GotOne)
- {
- for (index = 0; index < mfBytesReceived; index++)
- {
- if (mfInComingData[index]==0x0D) //Does this one have just returns?
- {
- GotOne = true;
- index++; //convert the index into the size
-
- if (mfMyHandler) //have them handle it and clear it
- mfMyHandler->ReceiveString(mfInComingData, index);
- BlockMove(&mfInComingData[index], &mfInComingData[0], mfBytesReceived-index);
- mfBytesReceived-=index;
- index = 0;
- }
- }
- }
- if ((!GotOne)&&(mfBytesReceived>sizeof(mfInComingData)/2)) //it's just a whole lot with no line feed
- {
- if (mfMyHandler) //have them handle it and clear it
- mfMyHandler->ReceiveString(mfInComingData, mfBytesReceived);
- mfBytesReceived = 0;
- }
- }
- while (GotOne);
- io = URLGetDataAvailable(mfTheReference, &available);
- mfDataWaiting = (io == noErr) && (available>0);
- }
- #endif
- }
-
- //
- // Close The File
- //
- void SubWooferEndPoint::HandleShutdown(void)
- {
- #ifdef USESUBWOOFER
- if (mfMyHandler)
- {
- mfMyHandler->Disconnect();
- }
- #endif
- }
-
- //
- // Get the header
- //
- OSErr SubWooferEndPoint::GetSubWoofHeader(Str31 ModDate)
- {
- #ifdef USESUBWOOFER
- OSErr io;
- Str255 tempstr;
- char* cp;
- Size offset;
- char* thebuffer;
- Size thesize;
-
- ModDate[0] = 0;
-
- if (mfMyHandler)
- {
- io = URLGetPropertySize(mfTheReference, kURLHTTPRespHeader, &thesize);
- if (io!=noErr)
- return io;
-
- thebuffer = NewPtrClear(thesize);
-
- io = URLGetProperty(mfTheReference, kURLHTTPRespHeader, thebuffer, thesize);
- if (io==noErr)
- {
- cp = thebuffer; offset = thesize;
- do
- {
- if (MyCompareStr(cp, "Last-Modified:"))
- {
- cp += 15; offset -= 15; //skip past the last-modified
- do
- {
- ModDate[0]++;
- ModDate[ModDate[0]] = *cp;
- cp++; offset--;
- }
- while ((offset>0) && (*cp!=0x0D)&&(ModDate[0]<31));
- DisposePtr(thebuffer);
- return noErr;
- }
-
- do
- {
- cp++; offset--;
- }
- while ((offset>0)&&(*cp!=0x0A));//linefeed
-
- cp++; offset--; //skip past the line feed
- }
- while (offset>0);
- }
- DisposePtr(thebuffer);
- return io;
- }
- else return -1;
- #endif
- }
-